package com.thank.concurrency.samples.singleton;

import com.thank.concurrency.annoations.ThreadSafe;

/**
 * 懒汉式 -> 双重同步锁单例模式 加 volatile
 * 加 volatile 来保证不会发生指令重排, 也就消除了线程不安全的情况
 */
@ThreadSafe
public class SingletonExample5 {

    // 私有的构造方法
    private SingletonExample5() {}

    // 单例对象 volatile + 双重检测机制 -> 禁止指令重排
    private volatile static SingletonExample5 instance = null;

    // 静态的工厂方法
    public static SingletonExample5 getInstance() {
        // 双重检测机制
        if (null == instance) {  // Thread_B
            // 同步锁机制
            synchronized (SingletonExample5.class) {
                if (null == instance) {
                    instance = new SingletonExample5(); // Thread_A - 3
                }
            }

        }
        return instance;
    }

}
